<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // ES6类的继承 


        // ES5的类继承 ： 1.构造函数的继承 2.原型的继承；
        // function Dad(name,age){
        //     this.name = name;
        //     this.age = age;
        // }

        // Dad.prototype.fn = function(){
        //     console.log("父构造函数的方法");
        // }

        // function Son(){
        //     Dad.call(this,...arguments);
        //     // Dad.apply(this,arguments);
        //     // Dad.bind(this)(...arguments);
        // }

        // function Link(){}
        // Link.prototype = Dad.prototype;
        // Son.prototype = new Link();
        // Son.prototype.constructor = Son;
        // let zhangsan = new Son("张三",20);
        // console.log(zhangsan);
        // zhangsan.fn();


        // ES6的继承 ； extends 扩展
        // class Dad{
        //     constructor(name,age){
        //         this.name = name;
        //         this.age = age;
        //     }
        //     fn(){
        //         console.log("父类的fn方法");
        //     }
        // }

        // class Son extends Dad{
            
        // }

        // let zhangsan = new Son("张三",20);
        // console.log(zhangsan);
        // zhangsan.fn();



        // 如果子类 需要扩展自己的属性 ，需要有自己的constructor 写法有区别
        // 子类一旦有自己的constructor 之后 就必须调用一个预定义函数 super();
        // class Dad{
        //     constructor(name,age){
        //         this.name = name;
        //         this.age = age;
        //     }
        //     fn(){
        //         console.log("父类的fn方法");
        //     }
        // }

        // class Son extends Dad{
        //     constructor(name,age){
        //         super(name,age);
        //     }
        // }

        // let zhangsan = new Son("张三",20);
        // console.log(zhangsan);
        // zhangsan.fn();


        // super 注意点 ：
        /* 
            1.super 只能在子类调用 可以再constructor里或者是函数里调用super
                constructor 调用super函数可以传参 给父类
            2.super 不能单独使用
            3. 子类的this 必须在super之后调用
            4. 如果 子类 没有constructor 那么 子类会自动调用 constructor和super方法并传参
        */
    //    子类会继承 父类的属性和方法 ，还会继承父类的静态成员 

        class Dad{
            static money = "$100000";
            constructor(name,age){
                this.name = name;
                this.age = age;
            }
            fn(){
                console.log("父类的fn方法");
            }
        }
        class Son extends Dad{
            constructor(name,age){
                super(name,age);
                this.height = "178cm";
               
            }
            fn(){
                // console.log(super); // 不能单独使用
                super.fn();  // 调用了父类的fn方法；
                console.log("子类的fn方法");
            }
        }
        // console.log(Son.money);
        // console.dir(Son.__proto__ === Dad);
        // let zhangsan = new Son("张三",20);
        // console.log(zhangsan);
        // zhangsan.fn();
    </script>
</body>
</html>